using Os.Domain;
using Os.WebUI.ViewModels;
using System;
using System.Collections.Generic;
using System.Web.Mvc;
using System.Web.Security;
using Os.WebUI.Helpers;

namespace Os.WebUI.Controllers
{
    /// <summary>
    /// 
    /// </summary>
	public class OrdemServicoController : Controller
	{
        private List<OrdemServico> objOs = null;

        public OrdemServicoController()
        {
            this.objOs = new List<OrdemServico>();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
		[Authorize(Roles = "Administrador")]
		public ActionResult Index(int ano, int mes)
		{
            ViewData["TituloMes"] = CalendarioHelper.ObterMesPorExtenso(mes) + " de " + ano;
			return View(OrdemServico.CarregarTodosPorMesEAno(ano,mes));
		}

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
		[Authorize(Roles = "Administrador,Cliente")]
		public ActionResult Detalhes(int id)
		{
			return View(OrdemServico.CarregarObjeto(id));
		}

        /// <summary>
        /// 
        /// </summary>
        /// <param name="roleName"></param>
        /// <returns></returns>
		private List<MembershipUser> getAllUsersInRole(string roleName)
		{
			List<MembershipUser> list = new List<MembershipUser>();
			string[] usersInRole = Roles.GetUsersInRole(roleName);
			string[] array = usersInRole;
			for (int i = 0; i < array.Length; i++)
			{
				string username = array[i];
				list.Add(Membership.GetUser(username));
			}
			return list;
		}
		
        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [Authorize(Roles = "Administrador")]        
		public ActionResult Editar(int id)
		{
            this.CarregarDadosDeEdicao();
            OrdemServico objOs = OrdemServico.CarregarObjeto(id);

			return View(objOs);
		}

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <param name="collection"></param>
        /// <param name="inputOs"></param>
        /// <returns></returns>
		[Authorize(Roles = "Administrador"), HttpPost]
		public ActionResult Editar(int id, FormCollection collection, OrdemServico inputOs)
		{
			OrdemServico objOs = null;
			
			try
			{
                objOs = new OrdemServico(id);

                objOs.ParecerTecnico = inputOs.ParecerTecnico;
                objOs.ValorHora = inputOs.ValorHora;
                objOs.TipoAtendimento = (TipoAtend)Convert.ToInt32(collection["TipoAtendimento"]);
                objOs.LocalAtendimento = (LocalAtend)Convert.ToInt32(collection["LocalAtendimento"]);
                //objOs.StatusOs = (StatusOrdemServico)Convert.ToInt32(collection["Status"]);
                objOs.Observacao = inputOs.Observacao;

                if (Convert.ToInt32(collection["atendente"]) != -1)
                    objOs.Atendente = Membership.GetUser(Convert.ToInt32(collection["atendente"]));

                objOs.Salvar();
				return RedirectToAction("OrdemServicoSucesso");
			}
			catch (Exception ex)
			{
				ViewData["Result"] = "Erro encontrado: " + ex.Message;
                this.CarregarDadosDeEdicao();
				return View(objOs);
			}
		}

        /// <summary>
        /// 
        /// </summary>
        private void CarregarDadosDeEdicao()
        {
            ViewData["TipoAtendimento"] = TipoAtendimento.CarregarTodos();
            ViewData["LocalAtendimento"] = LocalAtendimento.CarregarTodos();
            ViewData["StatusOs"] = StatusOs.CarregarTodos();
            ViewData["Users"] = this.getAllUsersInRole("Administrador");
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
		[Authorize(Roles = "Administrador,Cliente"),HttpGet]
		public ActionResult AberturaOrdemServico()
		{
            return View(this.loadAberturaChamado());
		}
		
        /// <summary>
        /// 
        /// </summary>
        /// <param name="collection"></param>
        /// <returns></returns>
        [Authorize(Roles = "Administrador,Cliente"), HttpPost]
		public ActionResult AberturaOrdemServico(FormCollection collection)
		{
			OrdemServico objOs = new OrdemServico();

			try
			{
                string servicoSolicitado = collection["os.ServicoSolicitado"].ToString();
                MembershipUser user = Membership.GetUser(User.Identity.Name);
                Cliente cliente = Cliente.CarregarObjetoPorUsuario(user);

                objOs.RealizarAbertura(servicoSolicitado, cliente );
                
                if (collection["Equipamentos"].ToString() != "")
                    objOs.equipamento = Equipamento.CarregarObjeto(Convert.ToInt32(collection["Equipamentos"]));

                objOs.Salvar();

				return RedirectToAction("AberturaOrdemServicoSucesso");
			}
			catch (FormatException ex)
			{
				ViewData["Result"] = "Erro encontrado: " + ex.Message;
				return View(this.loadAberturaChamado());
			}
			catch (Exception ex)
			{
				ViewData["Result"] = "Erro encontrado: " + ex.Message;
				return View(this.loadAberturaChamado());
			}
		}

        /// <summary>
        /// Carrega o Objeto AberturaChamadoViewModel
        /// </summary>
        /// <returns></returns>
        public AberturaChamadoViewModel loadAberturaChamado()
        {
            AberturaChamadoViewModel objAbertChamado = new AberturaChamadoViewModel();
            objAbertChamado.equipamentos = Equipamento.CarregarPorCliente(Cliente.CarregarObjetoPorUsuario(Membership.GetUser(User.Identity.Name)));
            objAbertChamado.os = new OrdemServico();
            return objAbertChamado;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public ActionResult AberturaOrdemServicoSucesso()
        {
            return View();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public ActionResult OrdemServicoSucesso()
        {
            return View();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [Authorize(Roles = "Cliente"), HttpGet]
        public ActionResult Finalizar(int id)
        {
            OrdemServico ObjOs = null;
            try
            {
                ObjOs = new OrdemServico(id);
                ObjOs.Finalizar();
                return RedirectToAction("Index", "Home");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        [Authorize(Roles="Administrador"),HttpGet]
        public JsonResult PausarOuContinuar(int id)
        {
            OrdemServico ordem = new OrdemServico(id);
            ordem.PausarOuContinuar();
            return Json(ordem, JsonRequestBehavior.AllowGet);
        }

        [Authorize(Roles="Administrador,Cliente")]
        public ActionResult AlterarStatus(int id)
        {
            OrdemServico ordem = new OrdemServico(id);

            switch (ordem.StatusOs)
            {
                case StatusOrdemServico.Solicitado:
                    ordem.IniciarAtendimento();
                    break;
                case StatusOrdemServico.EmAtendimento:
                    ordem.IniciarAnalise();
                    break;
                case StatusOrdemServico.EmAnalise:
                    {
                        ordem.Resolver();
                    }
                    break;
                default:
                    break;
            }

            return this.RedirectToAction("Editar", new { id = ordem.IdOrdemServico });
        }

        [Authorize(Roles = "Administrador"), HttpGet]
        public ActionResult OrdensServicoPendentes()
        {
            this.objOs = OrdemServico.CarregarPendentes();
            return View(objOs);
        }

        [Authorize(Roles = "Cliente"), HttpGet]
        public ActionResult MinhasOrdensServico()
        {
            this.objOs = OrdemServico.CarregarPorCliente(Cliente.CarregarObjetoPorUsuario(Membership.GetUser()));
            return View(objOs);
        }

        [Authorize(Roles = "Cliente"), HttpGet]
        public ActionResult DetalhesOrdemServico(int id)
        {
            return View(OrdemServico.CarregarObjeto(id));
        }
	}
}
